package com.bdzl.api.util;

import com.alibaba.fastjson.JSONObject;
import com.bdzl.api.entity.PaaSResponse;
import com.bdzl.pub.config.Constant;
import com.tencentcloudapi.common.Credential;
import com.tencentcloudapi.common.exception.TencentCloudSDKException;
import com.tencentcloudapi.common.profile.ClientProfile;
import com.tencentcloudapi.common.profile.HttpProfile;
import com.tencentcloudapi.faceid.v20180301.FaceidClient;
import com.tencentcloudapi.faceid.v20180301.models.*;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Component;

import java.io.IOException;
import java.io.InputStream;
import java.util.HashMap;
import java.util.Map;
import java.util.Properties;

/**
 * @author DK
 * @date 2019-10-08 11:20
 **/
@Component
public class TengxunCloudApi {

    private static Logger logger = LoggerFactory.getLogger(TengxunCloudApi.class);


    private  static String appId ;
    private  static String appSecret ;
    private  static String secretId ;
    private  static String secretKey ;
    private  static String bucketName ;
    private static String region;
    private static String url;

    static {
        Properties properties = new Properties();
        InputStream inputStream =  TengxunCloudApi.class
                .getClassLoader()
                .getResourceAsStream("config.properties");
        try {
            properties.load(inputStream);
            appId = Constant.bdzl_tengxun_could_AppId;
            appSecret = Constant.bdzl_tengxun_could_AppSecret;
            secretId = Constant.bdzl_tengxun_could_secretId;
            secretKey = Constant.bdzl_tengxun_could_secretKey;
            bucketName = Constant.bdzl_tengxun_could_bucket_name_OCR;
            region = Constant.bdzl_tengxun_could_region;
            url = Constant.bdzl_tengxun_could_url;
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

    /**
     * 身份信息认证
     * @param IdCard 身份证号
     * @param Name 姓名
     * @return
     * Result:
     * 认证结果码，收费情况如下。
     * 收费结果码：
     * 0: 姓名和身份证号一致
     * -1: 姓名和身份证号不一致
     * 不收费结果码：
     * -2: 非法身份证号（长度、校验位等不正确）
     * -3: 非法姓名（长度、格式等不正确）
     * -4: 证件库服务异常
     * -5: 证件库中无此身份证记录
     */
    public PaaSResponse idCard(String IdCard , String Name){
        try{
            FaceidClient client = getFaceidClient();
            Map<String, Object> map = new HashMap<>(16);
            map.put("IdCard", IdCard);
            map.put("Name", Name);
            String params = JSONObject.toJSONString(map);
            IdCardVerificationRequest req = IdCardVerificationRequest.fromJsonString(params, IdCardVerificationRequest.class);
            IdCardVerificationResponse resp = client.IdCardVerification(req);
            String jsonString = IdCardVerificationRequest.toJsonString(resp);
            return JSONObject.parseObject(jsonString, PaaSResponse.class);
        } catch (TencentCloudSDKException e) {
            logger.info(e.getMessage(),e);
            return null;
        }
    }

    /**
     * 手机号三要素核验
     * @param IdCard 身份证号
     * @param Name 姓名
     * @param Phone 手机号
     * @return
     * Result:
     *  认证结果码:
     *  收费结果码
     *  0: 认证通过
     *  -4: 信息不一致（手机号已实名，但姓名和身份证号与实名信息不一致）
     *  -5: 手机号未实名 不收费结果码
     *  -6: 手机号码不合法
     *  -7: 身份证号码有误
     *  -8: 姓名校验不通过
     *  -9: 没有记录
     *  -10: 认证未通过
     *  -11: 验证中心服务繁忙
     */
    /*public PaaSResponse idCardAndPhone(String IdCard , String Name,String Phone){
        try{
            FaceidClient client = getFaceidClient();
            Map<String, Object> map = new HashMap<>(16);
            map.put("IdCard", IdCard);
            map.put("Name", Name);
            map.put("Phone", Phone);
            String params = JSONObject.toJSONString(map);
            PhoneVerificationRequest req = PhoneVerificationRequest.fromJsonString(params, PhoneVerificationRequest.class);
            PhoneVerificationResponse resp = client.PhoneVerification(req);
            String jsonString = IdCardVerificationRequest.toJsonString(resp);
            return JSONObject.parseObject(jsonString, PaaSResponse.class);
        } catch (TencentCloudSDKException e) {
            logger.info(e.getMessage(),e);
            return null;
        }
    }*/

    /**
     * 银行卡二要素核验
     * @param BankCard 银行卡
     * @param Name 姓名
     * @return
     * Result
     * 认证结果码。
     * '0': '认证通过'
     * '-1': '认证未通过'
     * '-2': '姓名校验不通过'
     * '-3': '银行卡号码有误'
     * '-4': '持卡人信息有误'
     * '-5': '未开通无卡支付'
     * '-6': '此卡被没收'
     * '-7': '无效卡号'
     * '-8': '此卡无对应发卡行'
     * '-9': '该卡未初始化或睡眠卡'
     * '-10': '作弊卡、吞卡'
     * '-11': '此卡已挂失'
     * '-12': '该卡已过期'
     * '-13': '受限制的卡'
     * '-14': '密码错误次数超限'
     * '-15': '发卡行不支持此交易'
     * '-16': '服务繁忙'
     */
    public  PaaSResponse bankCard2(String BankCard ,String Name){
        try{
            FaceidClient client = getFaceidClient();
            Map<String, Object> map = new HashMap<>(16);
            map.put("BankCard", BankCard);
            map.put("Name", Name);
            String params =  JSONObject.toJSONString(map);
            BankCard2EVerificationRequest req = BankCard2EVerificationRequest.fromJsonString(params, BankCard2EVerificationRequest.class);
            BankCard2EVerificationResponse resp = client.BankCard2EVerification(req);
            String jsonString = BankCard2EVerificationRequest.toJsonString(resp);
            return JSONObject.parseObject(jsonString, PaaSResponse.class);
        } catch (TencentCloudSDKException e) {
            logger.info(e.getMessage(),e);
            return null;
        }

    }

    /**
     * 银行卡三要素核验
     * @param BankCard 银行卡
     * @param Name 姓名
     * @param IdCard 开户证件号，与CertType参数的证件类型一致，如：身份证，则传入身份证号。
     * @param CertType 否
     * 证件类型，请确认该证件为开户时使用的证件类型，未用于开户的证件信息不支持验证。（不填默认0）
     * 0 身份证
     * 1 军官证
     * 2 护照
     * 3 港澳证
     * 4 台胞证
     * 5 警官证
     * 6 士兵证
     * 7 其它证件
     * @return
     * 认证结果码。
     * '0': '认证通过'
     * '-1': '认证未通过'
     * '-2': '姓名校验不通过'
     * '-3': '身份证号码有误'
     * '-4': '银行卡号码有误'
     * '-5': '持卡人信息有误'
     * '-6': '未开通无卡支付'
     * '-7': '此卡被没收'
     * '-8': '无效卡号'
     * '-9': '此卡无对应发卡行'
     * '-10': '该卡未初始化或睡眠卡'
     * '-11': '作弊卡、吞卡'
     * '-12': '此卡已挂失'
     * '-13': '该卡已过期'
     * '-14': '受限制的卡'
     * '-15': '密码错误次数超限'
     * '-16': '发卡行不支持此交易'
     * '-17': '服务繁忙'
     */
    public  PaaSResponse bankCard3(String BankCard ,String Name,String IdCard,String CertType){
        try{
            FaceidClient client = getFaceidClient();
            Map<String, Object> map = new HashMap<>(16);
            map.put("BankCard", BankCard);
            map.put("Name", Name);
            map.put("IdCard", IdCard);
            map.put("CertType", CertType);
            String params =  JSONObject.toJSONString(map);
            BankCardVerificationRequest req = BankCardVerificationRequest.fromJsonString(params, BankCardVerificationRequest.class);
            BankCardVerificationResponse resp = client.BankCardVerification(req);
            String jsonString = BankCardVerificationRequest.toJsonString(resp);
            return JSONObject.parseObject(jsonString, PaaSResponse.class);
        } catch (TencentCloudSDKException e) {
            logger.info(e.getMessage(),e);
            return null;
        }

    }

    /**
     * 银行卡四要素核验
     * @param BankCard 银行卡
     * @param Name 姓名
     * @param IdCard 开户证件号，与CertType参数的证件类型一致，如：身份证，则传入身份证号
     * @param CertType 否
     * 证件类型，请确认该证件为开户时使用的证件类型，未用于开户的证件信息不支持验证。（不填默认0）
     * 0 身份证
     * 1 军官证
     * 2 护照
     * 3 港澳证
     * 4 台胞证
     * 5 警官证
     * 6 士兵证
     * 7 其它证件
     * @param Phone 手机号码
     * @return
     * 认证结果码。
     * '0': '认证通过'
     * '-1': '认证未通过'
     * '-2': '姓名校验不通过'
     * '-3': '身份证号码有误'
     * '-4': '银行卡号码有误'
     * '-5': '手机号码不合法'
     * '-6': '持卡人信息有误'
     * '-7': '未开通无卡支付'
     * '-8': '此卡被没收'
     * '-9': '无效卡号'
     * '-10': '此卡无对应发卡行'
     * '-11': '该卡未初始化或睡眠卡'
     * '-12': '作弊卡、吞卡'
     * '-13': '此卡已挂失'
     * '-14': '该卡已过期'
     * '-15': '受限制的卡'
     * '-16': '密码错误次数超限'
     * '-17': '发卡行不支持此交易'
     * '-18': '服务繁忙'
     */
    public  PaaSResponse bankCard4(String BankCard ,String Name,String IdCard,String CertType,String Phone){
        try{
            FaceidClient client = getFaceidClient();
            Map<String, Object> map = new HashMap<>(16);
            map.put("BankCard", BankCard);
            map.put("Name", Name);
            map.put("IdCard", IdCard);
            map.put("CertType", CertType);
            map.put("Phone", Phone);
            String params =  JSONObject.toJSONString(map);
            BankCard4EVerificationRequest  req = BankCard4EVerificationRequest.fromJsonString(params, BankCard4EVerificationRequest.class);
            BankCard4EVerificationResponse  resp = client.BankCard4EVerification(req);
            String jsonString = BankCard4EVerificationRequest.toJsonString(resp);
            return JSONObject.parseObject(jsonString, PaaSResponse.class);
        } catch (TencentCloudSDKException e) {
            logger.info(e.getMessage(),e);
            return null;
        }

    }

    private static FaceidClient getFaceidClient() {
        FaceidClient client;
        Credential cred = new Credential(secretId, secretKey);
        HttpProfile httpProfile = new HttpProfile();
        httpProfile.setEndpoint(url);
        ClientProfile clientProfile = new ClientProfile();
        clientProfile.setHttpProfile(httpProfile);
        client = new FaceidClient(cred, region, clientProfile);
        return client;
    }


}
